package com.bbva.kyfb.kyfbws.services.v01;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.bbva.jee.arq.spring.core.gce.CodigoError;
import com.bbva.jee.arq.spring.core.gce.ExcepcionEjecucionAplicacion;
import com.bbva.jee.arq.spring.core.httpService.HttpService;
import com.bbva.kyfb.kyfbbofc.IHistoricoBo;
import com.bbva.kyfb.kyfbdto.firmas.bo.FicheroConfeccion;
import com.bbva.kyfb.kyfbdto.firmas.bo.FicheroInfo;
import com.bbva.kyfb.kyfbdto.firmas.errores.Errores_kyfb_servicios;
import com.bbva.kyfb.kyfbdto.firmas.fachada.interfaces.v01.IServicioHistoricoV01;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFile;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileAudit;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileAuditRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileAuditResponse;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileRequest;
import com.bbva.kyfb.kyfbdto.firmas.fachada.v01.InfoFileResponse;
import com.bbva.kyfb.kyfbws.converters.DtoInToDtoOut;
import com.bbva.kyfb.kyfbws.converters.DtoOutToDtoIn;

/**
 * The Class SrvHistoricoV01.
 */
@HttpService(serviceName="servicioHistoricoHttp")
@Component
public class SrvHistoricoV01 implements IServicioHistoricoV01 {

	/** The servicio historico bo. */
	@Autowired
	private IHistoricoBo servicioHistoricoBO;
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoFileAuditResponse getAuditoriaComponenteHistorico(final InfoFileAuditRequest info) {
		InfoFileAuditResponse file = new InfoFileAuditResponse();
		ArrayList<InfoFileAudit> lista = new ArrayList<InfoFileAudit>();
		try{
			FicheroInfo ficheroInfo= DtoOutToDtoIn.infoFileAuditRequestToFicheroInfo(info);
			lista = DtoInToDtoOut.auditoriasBoToInfoFileAuditsFacade(servicioHistoricoBO.getAuditoriaComponenteHistorico(ficheroInfo));
			file.setCodError(Errores_kyfb_servicios.OK.toString());
		} catch(ExcepcionEjecucionAplicacion ea) {
			file.setCodError(ea.getCodigoError().toString());
		}
		file.setInfoFilesAudit(lista);
		return file;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public InfoFileResponse getComponentesHistoricoReferencia(final InfoFileRequest info) {
		InfoFileResponse infoF = new InfoFileResponse();
		ArrayList<InfoFile> infoFiles = new ArrayList<InfoFile>();
		try {
			FicheroInfo  ficheroInfo = DtoOutToDtoIn.infoFileRequestToFicheroInfo(info);
			List<FicheroConfeccion> listaInicial=servicioHistoricoBO.getComponentesHistoricoReferencia(ficheroInfo);
			List<FicheroConfeccion> listaFinalPaginada = realizarOrdenacionyPaginadoReferenciaHistorico(listaInicial, ficheroInfo);
			infoFiles= DtoInToDtoOut.ficherosConfeccionToInfoFiles(listaFinalPaginada);
			
			CodigoError eTx = servicioHistoricoBO.getErrorPorTx();
			String rdoTx;
			
				if(eTx!=null){
					rdoTx = eTx.toString();
				}else{
					rdoTx = Errores_kyfb_servicios.OK.toString();
				}	
				
			infoF.setCodError(rdoTx);
			infoF.setTotalComponentes(listaInicial.size());
		} catch(ExcepcionEjecucionAplicacion ea) {
			infoF.setCodError(ea.getCodigoError().toString());
			infoF.setTotalComponentes(infoFiles.size());
		}
		infoF.setInfoFiles(infoFiles);
		return infoF;
	}
	
	private List<FicheroConfeccion> realizarOrdenacionyPaginadoReferenciaHistorico(final List<FicheroConfeccion> list, final FicheroInfo ficheroInfo) {

		final List<FicheroConfeccion> listaux = new ArrayList<FicheroConfeccion>();				
		
		Collections.sort(list, new Comparator<FicheroConfeccion>() {

			@Override
			public int compare(FicheroConfeccion o1, FicheroConfeccion o2) {
				return o1.getdFechaProceso().compareTo(o2.getdFechaProceso());	//ordenacion por defecto para historico -> FECHA DE PROCESO
			}	
			
		});
		
		if (ficheroInfo.getsPaginacionDesde() < 1) {
			// Si es menor que 1, debemos inicializar la variable a 1
			ficheroInfo.setsPaginacionDesde(1);
		}

		if (ficheroInfo.getsPaginacionDesde() > list.size()) {
			// Si es mayor que el numero de elementos existentes, devolvemos error de paginado
			throw new ExcepcionEjecucionAplicacion(Errores_kyfb_servicios.ERROR_PAGINADO);
		}

		for(int i=ficheroInfo.getsPaginacionDesde()-1;listaux.size()<ficheroInfo.getsPaginacionNumElementos();i++) {
			if (i >= list.size()) {
				// Si nos vamos a pasar del maximo de elementos existentes, paramos el for
				break;
			}
			listaux.add(list.get(i));
		}
		return listaux;
	}	
}
